package com.yeyi.YTool;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.commons.lang3.StringUtils;

/**
 * 图片文件类型
 * 
 * @author: yeyi
 * @date: 2019年5月28日
 */
public class ImageType {
	public static final String TYPE_GIF = "gif";
	public static final String TYPE_JPEG = "jpeg";
	public static final String TYPE_JPG = "jpg";
	public static final String TYPE_PNG = "png";
	public static final String TYPE_BMP = "bmp";
	public static final String TYPE_ICON = "ico";
	public static final String TYPE_UNKNOWN = "unknown";
	public static final String TYPE_TIF = "tif";
	public static final String TYPE_TIFF = "tiff";

	/**
	 * 支持图片类型
	 * 
	 * @author: yeyi
	 * @date: 2019年5月28日
	 */
	enum supportType{
		// TODO: 有时间应该把 getPicType 中的图片魔幻码也与图片格式关联到这里，直接用枚举遍历判断代码会更简洁。
		GIF, JPEG, JPG, PNG, BMP, ICON, TIF, TIFF;
	}

	/**
	 * 判断是否支持此文件后缀
	 * @param fileName 包含后缀的文件名
	 * @author: yeyi
	 * @date: 2019年5月28日
	 */
	public static boolean isSuffixSupport(String fileName) {
		if(StringUtils.isBlank(fileName)) {
			return false;
		}

		String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
		if(StringUtils.isBlank(suffix)) {
			return false;
		}

		return EnumUtil.isEnum(suffix.toUpperCase(), supportType.class);
	}

	/**
	 * byte数组转换成16进制字符串
	 * @param src
	 * @return
	 */
	private static String bytesToHexString(byte[] src){
		StringBuilder stringBuilder = new StringBuilder();
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}


	/**
	 * 根据文件流判断图片类型
	 * @param fis
	 * @return jpg/png/gif/bmp
	 */
	public static String getPicType(FileInputStream fis) {
		//读取文件的前几个字节来判断图片格式
		byte[] b = new byte[4];
		try {
			fis.read(b, 0, b.length);
			String type = bytesToHexString(b).toUpperCase();
			if (type.contains("FFD8FF")) {
				return TYPE_JPG;
			} else if (type.contains("89504E47")) {
				return TYPE_PNG;
			} else if (type.contains("47494638")) {
				return TYPE_GIF;
			} else if (type.contains("424D")) {
				return TYPE_BMP;
			}else if (type.contains("00000100")){
				return TYPE_ICON;
			}else if (type.contains("49492A00")){
				return TYPE_TIF;
			}else{
				return TYPE_UNKNOWN;
			}

		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(fis != null){
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}
	
	public static void main(String[] args)throws Exception{
		//test code
		System.out.println(isSuffixSupport("abc.jpg"));
		System.out.println(isSuffixSupport("abc.html"));
		System.out.println("图片格式1： " + getPicType(new FileInputStream(new File("D:\\tmp\\头像\\Image.tiff"))));
		System.out.println("图片格式2： " + getPicType(new FileInputStream(new File("D:\\002.ico"))));
		Path files = Paths.get("D:\\002.ico");
		System.out.println("图片格式3： " + Files.probeContentType(files));
	}
}
